#!/usr/bin/env bash

# 这是一个配置文件操作模块，可以对固定形式的配置文件进行添加、删除、修改、和删除。
# 固定格式说明：
# 配置文件可以有多个集合，每个集合都有自己的名字并以"[集合名字]"的形式标记。
# 每个集合下有多个元素，每个元素都是"名字=内容”的形式标记，不同集合之间的元素不相互影响，可同名。
# 示例如下：
:<<!
[Section1]
key1=Variable1
key2=Variable2
key3=Variable3
[Section2]
key3=Variable2
key2=Variable3
key1=Variable4
[Section3]
key2=Variable3
key3=Variable4
key1=Variable5
!

# 读取配置，参数：
# 1.集合名字
# 2.元素名字
# 3.配置文件地址
# 打印出匹配的配置文件的整行内容，如果元素名字为空，则打印该集合下面的所有元素所在行的整行内容。
read_conf()
{
	Section=$1
	Key=$2
	Configfile=$3

    [[ -z ${Section} || -z ${Configfile} || ! -f ${Configfile} ]] && return 1
    line=""
    NoFindKey=1
    FindSection=
    while IFS=$'\n' read -r line; do
        if [[ $FindSection && $line != "["* ]]; then
            if [[ -z ${Key} ]]; then
                NoFindKey=
                echo "$line"
            elif [[ $line == "${Key}="* ]]; then
                NoFindKey=
                echo "$line"
                return 0
            fi
        fi
        if [[ $line == "[${Section}]" ]]; then
            FindSection=1
        elif  [[ $line == "["* ]]; then 
            FindSection=
        fi
    done < "${Configfile}"
    [[ ${NoFindKey} ]] || return 0
    return 1
}

# 写入配置文件
# 1.集合名字
# 2.元素名字
# 3.元素内容
# 4.配置文件地址
# 如果已经存在则修改为新的元素内容，不存在就添加元素，如果集合也不存在则添加集合和元素。
write_conf()
{
    Section=$1
    Key=$2
    Variable=$3
    Configfile=$4

    [[ -z $Section || -z $Key || -z $Variable || -z $Configfile ]] && return 1
    [[ -f $Configfile ]] || empty_file "$Configfile" || return 1
    lastline=""
    if section_data="$(read_conf ${Section} "" ${Configfile})"; then
        # find section
        while IFS=$'\n' read -r line; do
            [[ -z $line ]] || lastline="$line"
            [[ $line == "${Key}="* ]] && break
        done <<< "$section_data"
        New_Configfile="${Configfile}_tmp"
        echo -n "" >${New_Configfile}
        line=""
        FindSection=
        while IFS=$'\n' read -r line; do
            if [[ $FindSection && $line == $lastline ]]; then
                [[ $line == "${Key}="* ]] || echo "$line" >>${New_Configfile}
                echo "${Key}=${Variable}" >>${New_Configfile}
            else
                echo "$line" >>${New_Configfile}
            fi
            [[ $line == "[${Section}]" ]] && FindSection=1
            [[ $line != "[${Section}]" && $line == "["* ]] && FindSection=
            [[ $FindSection && "$lastline" == "" ]] && echo "${Key}=${Variable}" >>${New_Configfile} && FindSection=
        done < "${Configfile}"
        mv ${New_Configfile} ${Configfile}
    else
        # Add new Section
        echo "" >>${Configfile}
        echo "[${Section}]" >>${Configfile}
        echo "${Key}=${Variable}" >>${Configfile}
        echo "" >>${Configfile}
    fi
    return 0
}

# 删除配置，参数：
# 1.集合名字
# 2.元素名字
# 3.配置文件地址
# 删除匹配的配置文件的整行内容，如果元素名字为空，则删除该集合及其下面的所有元素所在行的整行内容。
del_conf()
{
	Section=$1
	Key=$2
	Configfile=$3

    [[ -z ${Section} || -z ${Configfile} || ! -f ${Configfile} ]] && return 1
    section_data="$(read_conf ${Section} "" ${Configfile})" || return 0
    New_Configfile="${Configfile}_new"
    echo -n "" >${New_Configfile}
    FindSection=
    while IFS=$'\n' read -r line; do
        [[ $line == "[${Section}]" ]] && FindSection=1
        [[ $line == "["* && $line != "[${Section}]" ]] && FindSection=
        [[ $FindSection && ${Key} == "" ]] && continue
        [[ $FindSection && $line == "${Key}="* ]] && continue
        [[ $FindSection && $section_data == "" ]] && continue
        echo "$line" >>${New_Configfile}
    done < "${Configfile}"
    mv ${New_Configfile} ${Configfile}
    return 0
}

module_init()
{
    debug_echo "Configure module is ok!"
    return 0
}

module_exit()
{
    debug_echo "Configure module exited!"
    return 0
}